package com.code.array_strings;

/**
 * 88.合并两个有序数组
 *
 * 1）给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，
 * 2）另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
 * 3）请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
 * 4）注意：最终，合并后数组不应由函数返回，而是存储在数组 nums1 中。
 * 为了应对这种情况，
 * nums1 的初始长度为 m + n，
 * 其中前 m 个元素表示应合并的元素，
 * 后 n 个元素为 0 ，应忽略。
 * nums2 的长度为 n 。
 *
 */
public class Solution_88 {
    public void merge(int[] nums1, int m, int[] nums2, int n) {

        // 设，numsl数组为i个,nums2数组为j个,合并后数组为k个
        int i = m - 1, j = n - 1, k = m + n - 1;
        // 当nums1数组大于0个且nums2数组大于0个时进方法内判断
        // 代码的主要部分是两个嵌套的while循环。外层的while循环负责处理nums1和nums2中都还有剩余元素的情况。它会从两个数组的末尾开始，比较当前位置的元素，然后将较大的元素放入nums1的对应位置，并将对应的指针向前移动一位。
        while (i >= 0 && j >= 0) {
            // 因为 非递减顺序 即可按递增判断赋值
            if (nums1[i] > nums2[j]) {
                nums1[k] = nums1[i];
                i--;
                // 如果nums2[j]比较大则进else
            } else {
                nums1[k] = nums2[j];
                j--;
            }
            k--;
        }
        // 当外层循环结束时，要么nums1已经没有剩余元素，要么nums2已经没有剩余元素。如果是前者，那么nums2中剩余的元素都应该比nums1中的所有元素都要大，可以直接复制到nums1的前面。这就是内层while循环的作用。
        while (j >= 0) {
            nums1[k] = nums2[j];
            j--;
            k--;
        }
    }
}